- summarize all insights and ideas from the other notebooks, as well as good exploratory plots
name: makeovermonday_2021w22 link: https://data.world/makeovermonday/2021w22 title: 2021/W22: The Plastic Waste Makers Index Data Source: Minderoo
- Production of single-use plastic (SUP) and contribution to single-use plastic waste is estimated and calculated in million metric tons in 2019.
- Rigid packaging is packaging that features heavier and often stronger materials than flexible packaging. Forms of rigid packaging materials include but are not limited to: glass, hard plastics, cardboard, metal, and so on. Rigid packaging supplies are usually more expensive than their flexible alternatives and most have significantly higher carbon footprints than flexible packaging. see https://www.industrialpackaging.com/blog/flexible-vs-rigid-packaging
- Flexible packaging includes all malleable packaging. Some common examples of flexible packaging include shrink film, stretch film, flexible pouches, seal bands, blister or skin packs, and clamshells. In reality, flexible packaging includes any protective packaging made from materials including plastic, paperboard, paper, foil, wax-coated paperboard, and similar materials, or combinations of these materials. see https://www.industrialpackaging.com/blog/flexible-vs-rigid-packaging
- In-scope polymersSingle-use plastics can, in theory, be produced from over a dozen polymer families. However, in 2019, we estimate that close to 90 per cent of all single-use plastics by mass were produced from just five polymers: polypropylene (PP), high-density polyethylene (HDPE), low-density polyethylene (LDPE), linear low-density polyethylene (LLDPE), and polyethylene terephthalate resin (PET) (Figure M2). see https://cdn.minderoo.org/content/uploads/2021/05/18065501/20210518-Plastic-Waste-Makers-Index.pdf
head(plastic)
summary(plastic)
rank polymer_producer no_of_assets production_of_in_scope_polymers flexible_format_contribution_to_sup_waste rigid_format_contribution_to_sup_waste
Min. : 1.00 Length:100 Min. : 0.00 Min. : 0.200 Min. :0.000 Min. :0.000
1st Qu.: 25.75 Class :character 1st Qu.: 3.00 1st Qu.: 0.500 1st Qu.:0.100 1st Qu.:0.100
Median : 50.50 Mode :character Median : 6.00 Median : 0.900 Median :0.200 Median :0.200
Mean : 50.50 Mean :11.56 Mean : 1.805 Mean :0.538 Mean :0.416
3rd Qu.: 75.25 3rd Qu.:12.25 3rd Qu.: 1.700 3rd Qu.:0.500 3rd Qu.:0.500
Max. :100.00 Max. :82.00 Max. :11.600 Max. :4.700 Max. :4.500
total_contribution_to_sup_waste
Min. :0.200
1st Qu.:0.300
Median :0.450
Mean :0.950
3rd Qu.:0.925
Max. :5.900
| observations from clean nb |
- columns: rank numeric, ordered, unique, can serve as identifier, rank of producer according to index polymer_producer string, unique identifier, name of producer no_of_assets numeric, metric, number of assets of the producer production_of_in_scope_polymers numeric, metric in million metric tons, production of plolymers that are in-scope of preceding analysis flexible_format_contribution_to_sup_waste numeric, metric in million metric tons, flexible form of contribution to sup waste rigid_format_contribution_to_sup_waste numeric, metric in million metric tons, rigid form of contribution to sup waste total_contribution_to_sup_waste numeric, metric in million metric tons, total contribution is the sum of flexible and rigid
- no missing values at all, also it is a very small dataset
- no duplicated rows
- no changes were made to data set
| insights from describe uni |
- no_of_assets is poisson distributed, where most producer only have up to 9 (median = 6) assets, some have up to 29 (upper fence = 26), and only a few (outliers) are above that with up to 82 assets
- production_of_in_scope_polymers is poisson distributed, likes very similar to no_of_assets, median is 0.9, upper fence is 3.4, max is 11.6 -> might correlate with no_of_assets?
- flexible_format_contribution_to_sup_waste is poisson distributed, likes very similar to no_of_assets, median is 0.2, upper fence is 1.1, max is 4.7
- rigid_format_contribution_to_sup_waste is poisson distributed, likes very similar to no_of_assets, median is 0.2, upper fence is 1.1, max is 4.5, very similar to flexible_format_contribution_to_sup_waste, but with less outliers
- rigid_format_contribution_to_sup_waste is poisson distributed, likes very similar to no_of_assets (again), median is 0.45, upper fence is 1.9, max is 5.9 is sum of flexible_form + rigid_form
- ration of sup_waste to produced polymers is between min 0.3 and max 1.0 and has median 0.5, most data lies between 0.4 and 0.6, but there is a high spike at 1.0 (with count 15)
- comparing rigid_format and flexible_format shows that up to the upper fence 1.1, the distribution is similar, but there are more bigger (>3) outliers in flexible
name = 'total_contribution_to_sup_waste'
df <- plastic %>% rename(value = total_contribution_to_sup_waste) %>% select(value)
# https://ggplot2.tidyverse.org/reference/geom_dotplot.html
dotplot <- df %>%
ggplot(aes(x = value)) +
# geom_density() +
geom_histogram(binwidth = 0.1) +
# geom_dotplot(method="histodot", stackgroups = TRUE, stackratio = 1.1, dotsize = 1.2, binwidth = 1) +
theme_minimal() +
scale_y_continuous(breaks = NULL)
dotplot <- ggplotly(dotplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))
boxplot <- df %>%
ggplot(aes(x = 1, y = value)) +
geom_boxplot() +
theme_minimal() +
coord_flip() +
ggtitle(paste("distribution of", name, sep=" ")) +
scale_y_continuous(breaks = NULL)
boxplot <- ggplotly(boxplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))
# https://ggplot2.tidyverse.org/reference/geom_qq.html
plot_qq <- df %>%
ggplot(aes(sample = value)) +
geom_qq(alpha = 0.5) +
geom_qq_line() +
coord_flip() +
theme_minimal()
plot_qq <- ggplotly(plot_qq) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))
# https://plotly.com/r/subplots/
fig <- subplot(dotplot, boxplot, plot_qq, nrows = 3, margin = 0, heights = c(0.5, 0.2, 0.3), shareX = TRUE)
fig
name = c('flexible_format_contribution_to_sup_waste', 'rigid_format_contribution_to_sup_waste')
df <- plastic %>% rename(flexible = flexible_format_contribution_to_sup_waste, rigid = rigid_format_contribution_to_sup_waste) %>% select(flexible, rigid) %>% pivot_longer(cols = c(flexible,rigid))
boxplot <- df %>%
ggplot(aes(x = name, y = value, colour = name)) +
geom_boxplot() +
theme_minimal() +
coord_flip() +
ggtitle(paste("compare ", name[1], "and", name[2], sep=" ")) +
scale_y_continuous(breaks = NULL)
boxplot <- ggplotly(boxplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))
# https://ggplot2.tidyverse.org/reference/geom_dotplot.html
dotplot <- df %>%
ggplot(aes(x = value, fill = name)) +
# geom_density() +
geom_histogram(binwidth = 0.1, alpha = 0.5, position = "identity") +
# geom_dotplot(method="histodot", stackgroups = TRUE, stackratio = 1, dotsize = 0.23, binwidth = 0.1) +
theme_minimal() +
scale_y_continuous(breaks = NULL)
dotplot <- ggplotly(dotplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))
# https://ggplot2.tidyverse.org/reference/geom_qq.html
plot_qq <- df %>%
ggplot(aes(sample = value, colour = name)) +
geom_qq(alpha = 0.5) +
geom_qq_line(alpha = 0.5) +
coord_flip() +
theme_minimal()
plot_qq <- ggplotly(plot_qq) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))
# https://plotly.com/r/subplots/
fig <- subplot(dotplot, boxplot, plot_qq, nrows = 3, margin = 0, heights = c(0.5, 0.2, 0.3), shareX = TRUE)
fig
| insights from describe multi |
LS0tDQp0aXRsZTogInN1bW1hcnkgZm9yIHBsYXN0aWMgd2FzdGUgbWFrZXJzIGluZGV4IGRhdGEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQotLS0NCnB1cnBvc2Ugb2Ygbm90ZWJvb2sNCi0tLQ0KDQogIChpKSBzdW1tYXJpemUgYWxsIGluc2lnaHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBvdGhlciBub3RlYm9va3MsIGFzIHdlbGwgYXMgZ29vZCBleHBsb3JhdG9yeSBwbG90cw0KICANCi0tLQ0KaW5mb3JtYXRpb24NCi0tLQ0KDQpuYW1lOiBtYWtlb3Zlcm1vbmRheV8yMDIxdzIyDQpsaW5rOiBodHRwczovL2RhdGEud29ybGQvbWFrZW92ZXJtb25kYXkvMjAyMXcyMg0KdGl0bGU6IDIwMjEvVzIyOiBUaGUgUGxhc3RpYyBXYXN0ZSBNYWtlcnMgSW5kZXgNCkRhdGEgU291cmNlOiBbTWluZGVyb29dKGh0dHBzOi8vd3d3Lm1pbmRlcm9vLm9yZy9wbGFzdGljLXdhc3RlLW1ha2Vycy1pbmRleC9kYXRhL2luZGljZXMvcHJvZHVjZXJzLykNCg0KDQotLS0NCmRvbWFpbiBpbmZvcm1hdGlvbiANCi0tLQ0KDQogKGkpIFByb2R1Y3Rpb24gb2Ygc2luZ2xlLXVzZSBwbGFzdGljIChTVVApIGFuZCBjb250cmlidXRpb24gdG8gc2luZ2xlLXVzZSBwbGFzdGljIHdhc3RlIGlzIGVzdGltYXRlZCBhbmQgY2FsY3VsYXRlZCBpbiBtaWxsaW9uIG1ldHJpYyB0b25zIGluIDIwMTkuDQogKGkpIFJpZ2lkIHBhY2thZ2luZyBpcyBwYWNrYWdpbmcgdGhhdCBmZWF0dXJlcyBoZWF2aWVyIGFuZCBvZnRlbiBzdHJvbmdlciBtYXRlcmlhbHMgdGhhbiBmbGV4aWJsZSBwYWNrYWdpbmcuIEZvcm1zIG9mIHJpZ2lkIHBhY2thZ2luZyBtYXRlcmlhbHMgaW5jbHVkZSBidXQgYXJlIG5vdCBsaW1pdGVkIHRvOiBnbGFzcywgICAgICBoYXJkIHBsYXN0aWNzLCBjYXJkYm9hcmQsIG1ldGFsLCBhbmQgc28gb24uIFJpZ2lkIHBhY2thZ2luZyBzdXBwbGllcyBhcmUgdXN1YWxseSBtb3JlIGV4cGVuc2l2ZSB0aGFuIHRoZWlyIGZsZXhpYmxlIGFsdGVybmF0aXZlcyBhbmQgbW9zdCBoYXZlIHNpZ25pZmljYW50bHkgaGlnaGVyIGNhcmJvbiAgICAgICAgICAgICAgZm9vdHByaW50cyB0aGFuIGZsZXhpYmxlIHBhY2thZ2luZy4gc2VlIGh0dHBzOi8vd3d3LmluZHVzdHJpYWxwYWNrYWdpbmcuY29tL2Jsb2cvZmxleGlibGUtdnMtcmlnaWQtcGFja2FnaW5nDQogKGkpIEZsZXhpYmxlIHBhY2thZ2luZyBpbmNsdWRlcyBhbGwgbWFsbGVhYmxlIHBhY2thZ2luZy4gU29tZSBjb21tb24gZXhhbXBsZXMgb2YgZmxleGlibGUgcGFja2FnaW5nIGluY2x1ZGUgc2hyaW5rIGZpbG0sIHN0cmV0Y2ggZmlsbSwgZmxleGlibGUgcG91Y2hlcywgc2VhbCBiYW5kcywgYmxpc3RlciBvciBza2luICAgICAgICBwYWNrcywgYW5kIGNsYW1zaGVsbHMuIEluIHJlYWxpdHksIGZsZXhpYmxlIHBhY2thZ2luZyBpbmNsdWRlcyBhbnkgcHJvdGVjdGl2ZSBwYWNrYWdpbmcgbWFkZSBmcm9tIG1hdGVyaWFscyBpbmNsdWRpbmcgcGxhc3RpYywgcGFwZXJib2FyZCwgcGFwZXIsIGZvaWwsIHdheC1jb2F0ZWQgcGFwZXJib2FyZCwgYW5kICAgICAgc2ltaWxhciBtYXRlcmlhbHMsIG9yIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSBtYXRlcmlhbHMuIHNlZSBodHRwczovL3d3dy5pbmR1c3RyaWFscGFja2FnaW5nLmNvbS9ibG9nL2ZsZXhpYmxlLXZzLXJpZ2lkLXBhY2thZ2luZw0KIChpKSBJbi1zY29wZSBwb2x5bWVyc1NpbmdsZS11c2UgcGxhc3RpY3MgY2FuLCBpbiB0aGVvcnksIGJlIHByb2R1Y2VkIGZyb20gb3ZlciBhIGRvemVuIHBvbHltZXIgZmFtaWxpZXMuIEhvd2V2ZXIsIGluIDIwMTksIHdlIGVzdGltYXRlIHRoYXQgY2xvc2UgdG8gOTAgcGVyIGNlbnQgb2YgYWxsIHNpbmdsZS11c2UgICAgICAgICAgcGxhc3RpY3MgYnkgbWFzcyB3ZXJlIHByb2R1Y2VkIGZyb20ganVzdCBmaXZlIHBvbHltZXJzOiBwb2x5cHJvcHlsZW5lIChQUCksIGhpZ2gtZGVuc2l0eSBwb2x5ZXRoeWxlbmUgKEhEUEUpLCBsb3ctZGVuc2l0eSBwb2x5ZXRoeWxlbmUgKExEUEUpLCBsaW5lYXIgbG93LWRlbnNpdHkgcG9seWV0aHlsZW5lICAgICAgICAgIChMTERQRSksIGFuZCBwb2x5ZXRoeWxlbmUgdGVyZXBodGhhbGF0ZSByZXNpbiAoUEVUKSAoRmlndXJlIE0yKS4gc2VlIGh0dHBzOi8vY2RuLm1pbmRlcm9vLm9yZy9jb250ZW50L3VwbG9hZHMvMjAyMS8wNS8xODA2NTUwMS8yMDIxMDUxOC1QbGFzdGljLVdhc3RlLU1ha2Vycy1JbmRleC5wZGYNCiAgDQotLS0NCnN1bW1hcnkgaGlnaGxpZ2h0cw0KLS0tDQogIA0KDQoNCi0tLQ0Kc3Rvcmllcw0KLS0tDQoNCg0KDQotLS0NCmxvYWQgcGFja2FnZXMNCi0tLQ0KYGBge3IgbG9hZCBwYWNrYWdlcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKSAjIHRpZHkgZGF0YSBmcmFtZQ0KbGlicmFyeShwbG90bHkpICMgbWFrZSBnZ3Bsb3RzIGludGVyYWN0aXZlDQpgYGANCg0KLS0tDQpvdmVydmlldw0KLS0tDQpgYGB7cn0NCmhlYWQocGxhc3RpYykNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkocGxhc3RpYykNCmBgYA0KDQotLS0NCm9ic2VydmF0aW9ucyBmcm9tIGNsZWFuIG5iDQotLS0NCg0KICAoaSkgY29sdW1uczogcmFuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpYywgb3JkZXJlZCwgdW5pcXVlLCBjYW4gc2VydmUgYXMgaWRlbnRpZmllciwgcmFuayBvZiBwcm9kdWNlciBhY2NvcmRpbmcgdG8gaW5kZXgNCiAgICAgICAgICAgICAgIHBvbHltZXJfcHJvZHVjZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgdW5pcXVlIGlkZW50aWZpZXIsIG5hbWUgb2YgcHJvZHVjZXINCiAgICAgICAgICAgICAgIG5vX29mX2Fzc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMsIG1ldHJpYywgbnVtYmVyIG9mIGFzc2V0cyBvZiB0aGUgcHJvZHVjZXINCiAgICAgICAgICAgICAgIHByb2R1Y3Rpb25fb2ZfaW5fc2NvcGVfcG9seW1lcnMgICAgICAgICAgICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCBwcm9kdWN0aW9uIG9mIHBsb2x5bWVycyB0aGF0IGFyZSBpbi1zY29wZSBvZiBwcmVjZWRpbmcgYW5hbHlzaXMNCiAgICAgICAgICAgICAgIGZsZXhpYmxlX2Zvcm1hdF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCBmbGV4aWJsZSBmb3JtIG9mIGNvbnRyaWJ1dGlvbiB0byBzdXAgd2FzdGUNCiAgICAgICAgICAgICAgIHJpZ2lkX2Zvcm1hdF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlICAgICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCByaWdpZCBmb3JtIG9mIGNvbnRyaWJ1dGlvbiB0byBzdXAgd2FzdGUNCiAgICAgICAgICAgICAgIHRvdGFsX2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUgICAgICAgICAgICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCB0b3RhbCBjb250cmlidXRpb24gaXMgdGhlIHN1bSBvZiBmbGV4aWJsZSBhbmQgcmlnaWQNCiAgKGkpIG5vIG1pc3NpbmcgdmFsdWVzIGF0IGFsbCwgYWxzbyBpdCBpcyBhIHZlcnkgc21hbGwgZGF0YXNldA0KICAoaSkgbm8gZHVwbGljYXRlZCByb3dzDQogIChpKSBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0byBkYXRhIHNldA0KDQotLS0NCmluc2lnaHRzIGZyb20gZGVzY3JpYmUgdW5pDQotLS0NCg0KICAoaSkgbm9fb2ZfYXNzZXRzIGlzIHBvaXNzb24gZGlzdHJpYnV0ZWQsIHdoZXJlIG1vc3QgcHJvZHVjZXIgb25seSBoYXZlIHVwIHRvIDkgKG1lZGlhbiA9IDYpIGFzc2V0cywgc29tZSBoYXZlIHVwIHRvIDI5ICh1cHBlciBmZW5jZSA9IDI2KSwgYW5kIG9ubHkgYSBmZXcgKG91dGxpZXJzKSBhcmUgYWJvdmUgdGhhdCAgICAgICAgd2l0aCB1cCB0byA4MiBhc3NldHMNCiAgKGkpIHByb2R1Y3Rpb25fb2ZfaW5fc2NvcGVfcG9seW1lcnMgaXMgcG9pc3NvbiBkaXN0cmlidXRlZCwgbGlrZXMgdmVyeSBzaW1pbGFyIHRvIG5vX29mX2Fzc2V0cywgbWVkaWFuIGlzIDAuOSwgdXBwZXIgZmVuY2UgaXMgMy40LCBtYXggaXMgMTEuNg0KICAgICAgLT4gbWlnaHQgY29ycmVsYXRlIHdpdGggbm9fb2ZfYXNzZXRzPw0KICAoaSkgZmxleGlibGVfZm9ybWF0X2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUgaXMgcG9pc3NvbiBkaXN0cmlidXRlZCwgbGlrZXMgdmVyeSBzaW1pbGFyIHRvIG5vX29mX2Fzc2V0cywgbWVkaWFuIGlzIDAuMiwgdXBwZXIgZmVuY2UgaXMgMS4xLCBtYXggaXMgNC43DQogIChpKSByaWdpZF9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZSBpcyBwb2lzc29uIGRpc3RyaWJ1dGVkLCBsaWtlcyB2ZXJ5IHNpbWlsYXIgdG8gbm9fb2ZfYXNzZXRzLCBtZWRpYW4gaXMgMC4yLCB1cHBlciBmZW5jZSBpcyAxLjEsIG1heCBpcyA0LjUsDQogICAgICB2ZXJ5IHNpbWlsYXIgdG8gZmxleGlibGVfZm9ybWF0X2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUsIGJ1dCB3aXRoIGxlc3Mgb3V0bGllcnMNCiAgKGkpIHJpZ2lkX2Zvcm1hdF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlIGlzIHBvaXNzb24gZGlzdHJpYnV0ZWQsIGxpa2VzIHZlcnkgc2ltaWxhciB0byBub19vZl9hc3NldHMgKGFnYWluKSwgbWVkaWFuIGlzIDAuNDUsIHVwcGVyIGZlbmNlIGlzIDEuOSwgbWF4IGlzIDUuOQ0KICAgICAgaXMgc3VtIG9mIGZsZXhpYmxlX2Zvcm0gKyByaWdpZF9mb3JtDQogIChpKSByYXRpb24gb2Ygc3VwX3dhc3RlIHRvIHByb2R1Y2VkIHBvbHltZXJzIGlzIGJldHdlZW4gbWluIDAuMyBhbmQgbWF4IDEuMCBhbmQgaGFzIG1lZGlhbiAwLjUsIG1vc3QgZGF0YSBsaWVzIGJldHdlZW4gMC40IGFuZCAwLjYsIGJ1dCB0aGVyZSBpcyBhIGhpZ2ggc3Bpa2UgYXQgMS4wICh3aXRoIGNvdW50IDE1KQ0KICAoaSkgY29tcGFyaW5nIHJpZ2lkX2Zvcm1hdCBhbmQgZmxleGlibGVfZm9ybWF0IHNob3dzIHRoYXQgdXAgdG8gdGhlIHVwcGVyIGZlbmNlIDEuMSwgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzaW1pbGFyLCBidXQgdGhlcmUgYXJlIG1vcmUgYmlnZ2VyICg+Mykgb3V0bGllcnMgaW4gZmxleGlibGUNCg0KYGBge3J9DQpuYW1lID0gJ3RvdGFsX2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUnDQpkZiA8LSBwbGFzdGljICU+JSByZW5hbWUodmFsdWUgPSB0b3RhbF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlKSAlPiUgc2VsZWN0KHZhbHVlKQ0KDQojIGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZW9tX2RvdHBsb3QuaHRtbA0KZG90cGxvdCA8LSBkZiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArDQogICAgIyBnZW9tX2RlbnNpdHkoKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsNCiAgICAjIGdlb21fZG90cGxvdChtZXRob2Q9Imhpc3RvZG90Iiwgc3RhY2tncm91cHMgPSBUUlVFLCBzdGFja3JhdGlvID0gMS4xLCBkb3RzaXplID0gMS4yLCBiaW53aWR0aCA9IDEpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMKSANCmRvdHBsb3QgPC0gZ2dwbG90bHkoZG90cGxvdCkgJT4lIGxheW91dCh5YXhpcyA9IGxpc3Qoc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSwgc2hvd2dyaWQgPSBGQUxTRSkpDQoNCmJveHBsb3QgPC0gZGYgJT4lDQogIGdncGxvdChhZXMoeCA9IDEsIHkgPSB2YWx1ZSkpICsNCiAgICBnZW9tX2JveHBsb3QoKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBjb29yZF9mbGlwKCkgKw0KICAgIGdndGl0bGUocGFzdGUoImRpc3RyaWJ1dGlvbiBvZiIsIG5hbWUsIHNlcD0iICIpKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwpIA0KYm94cGxvdCA8LSBnZ3Bsb3RseShib3hwbG90KSAlPiUgbGF5b3V0KHlheGlzID0gbGlzdChzaG93dGlja2xhYmVscyA9IEZBTFNFLCBzaG93Z3JpZCA9IEZBTFNFKSkNCg0KIyBodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvZ2VvbV9xcS5odG1sIA0KcGxvdF9xcSA8LSBkZiAlPiUNCiAgZ2dwbG90KGFlcyhzYW1wbGUgPSB2YWx1ZSkpICsNCiAgICBnZW9tX3FxKGFscGhhID0gMC41KSArDQogICAgZ2VvbV9xcV9saW5lKCkgKw0KICAgIGNvb3JkX2ZsaXAoKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQpwbG90X3FxIDwtIGdncGxvdGx5KHBsb3RfcXEpICU+JSBsYXlvdXQoeWF4aXMgPSBsaXN0KHNob3d0aWNrbGFiZWxzID0gRkFMU0UsIHNob3dncmlkID0gRkFMU0UpKQ0KDQojIGh0dHBzOi8vcGxvdGx5LmNvbS9yL3N1YnBsb3RzLw0KZmlnIDwtIHN1YnBsb3QoZG90cGxvdCwgYm94cGxvdCwgcGxvdF9xcSwgbnJvd3MgPSAzLCBtYXJnaW4gPSAwLCBoZWlnaHRzID0gYygwLjUsIDAuMiwgMC4zKSwgc2hhcmVYID0gVFJVRSkgDQoNCmZpZw0KYGBgDQpgYGB7cn0NCm5hbWUgPSBjKCdmbGV4aWJsZV9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZScsICdyaWdpZF9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZScpDQpkZiA8LSBwbGFzdGljICU+JSByZW5hbWUoZmxleGlibGUgPSBmbGV4aWJsZV9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZSwgcmlnaWQgPSByaWdpZF9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZSkgJT4lIHNlbGVjdChmbGV4aWJsZSwgcmlnaWQpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMoZmxleGlibGUscmlnaWQpKQ0KDQpib3hwbG90IDwtIGRmICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBuYW1lLCB5ID0gdmFsdWUsIGNvbG91ciA9IG5hbWUpKSArDQogICAgZ2VvbV9ib3hwbG90KCkgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgY29vcmRfZmxpcCgpICsNCiAgICBnZ3RpdGxlKHBhc3RlKCJjb21wYXJlICIsIG5hbWVbMV0sICJhbmQiLCBuYW1lWzJdLCBzZXA9IiAiKSkgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMKSANCmJveHBsb3QgPC0gZ2dwbG90bHkoYm94cGxvdCkgJT4lIGxheW91dCh5YXhpcyA9IGxpc3Qoc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSwgc2hvd2dyaWQgPSBGQUxTRSkpDQoNCiMgaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2dlb21fZG90cGxvdC5odG1sDQpkb3RwbG90IDwtIGRmICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArDQogICAgIyBnZW9tX2RlbnNpdHkoKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEsIGFscGhhID0gMC41LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsNCiAgICAjIGdlb21fZG90cGxvdChtZXRob2Q9Imhpc3RvZG90Iiwgc3RhY2tncm91cHMgPSBUUlVFLCBzdGFja3JhdGlvID0gMSwgZG90c2l6ZSA9IDAuMjMsIGJpbndpZHRoID0gMC4xKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCkgDQpkb3RwbG90IDwtIGdncGxvdGx5KGRvdHBsb3QpICU+JSBsYXlvdXQoeWF4aXMgPSBsaXN0KHNob3d0aWNrbGFiZWxzID0gRkFMU0UsIHNob3dncmlkID0gRkFMU0UpKQ0KDQojIGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZW9tX3FxLmh0bWwgDQpwbG90X3FxIDwtIGRmICU+JQ0KICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IHZhbHVlLCBjb2xvdXIgPSBuYW1lKSkgKw0KICAgIGdlb21fcXEoYWxwaGEgPSAwLjUpICsNCiAgICBnZW9tX3FxX2xpbmUoYWxwaGEgPSAwLjUpICsNCiAgICBjb29yZF9mbGlwKCkgKw0KICAgIHRoZW1lX21pbmltYWwoKSANCnBsb3RfcXEgPC0gZ2dwbG90bHkocGxvdF9xcSkgJT4lIGxheW91dCh5YXhpcyA9IGxpc3Qoc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSwgc2hvd2dyaWQgPSBGQUxTRSkpDQoNCiMgaHR0cHM6Ly9wbG90bHkuY29tL3Ivc3VicGxvdHMvDQpmaWcgPC0gc3VicGxvdChkb3RwbG90LCBib3hwbG90LCBwbG90X3FxLCBucm93cyA9IDMsIG1hcmdpbiA9IDAsIGhlaWdodHMgPSBjKDAuNSwgMC4yLCAwLjMpLCBzaGFyZVggPSBUUlVFKSANCg0KZmlnDQpgYGANCg0KLS0tDQppbnNpZ2h0cyBmcm9tIGRlc2NyaWJlIG11bHRpDQotLS0NCg0KDQoNCg0KDQoNCg==